package cl.tinet.trainee.salas.web.mb;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import cl.tinet.trainee.salas.ejb.sala.SalaBeanInterfaz;
import cl.tinet.trainee.salas.model.Sala;

/**
 * Managed bean de salas.
 * 
 * @author Naht-Sams
 */
@ManagedBean(name = "SalaMB")
@SessionScoped
public class SalaMB implements Serializable {

    /**
     * Serial Version.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Conexion al bean.
     */
    @EJB(mappedName = "SalaBean", name = "SalaBean")
    private transient SalaBeanInterfaz bean;
    /**
     * Lista de salas.
     */
    private List<Sala> salas;
    /**
     * Objeto de la clase sala.
     */
    private Sala sala;
    /**
     * Propiedad del MB Usuario.
     */
    @ManagedProperty(value = "#{UsuarioMB}")
    private UsuarioMB usuarioMB;
    /**
     * 
     */
    private Date date;

    /**
     * Recivi los datos de un sala, luego se procede hacer una busqueda dentro
     * de la BD, si esque lo encuentra lo recive una excepcion la cual envia
     * un mensaje de error. En el caso contrario se agrega el dato en la BD.
     * 
     * @throws SalaException
     */
    public void crearSala() {
        // bean.buscarSalaAgregado(this.sala);
        bean.agregarBean(this.sala);
        saveMessage("Sala ingresada.");
        this.sala = null;
        RequestContext.getCurrentInstance()
                .execute("PF('dAgregarSala').hide()");
        desplegarSalas();
    }

    /**
     * Buscar la lista completa de salas que existen.
     */
    public void desplegarSalas() {
        this.salas = bean.buscarTodos();
    }

    /**
     * Buscar los datos de la sala que se este intentando eliminar.
     * 
     * @param salaRecivido
     *            Datos de la sala recivido.
     * @return Devuelve la direccion luego de encontrar la sala.
     */
    public String buscarEliminarSala(Sala salaRecivido) {
        this.sala = salaRecivido;
        return null;
    }

    /**
     * Proceder a eliminar una sala.
     * 
     * @param salaRecivido
     *            a.
     */
    public void eliminarSala(Sala salaRecivido) {
        this.sala = salaRecivido;
        if (bean.buscarReservasSala(this.sala)) {
            bean.eliminarBean(this.sala);
            desplegarSalas();
        } else {
            saveMessage("La sala contiene reservas. No se puede eliminar");
        }

    }

    /**
     * Buscar los datos de un sala que se desea modificar.
     * 
     * @param salaRecivido
     *            Datos del sala seleccionado
     */
    public void buscarModificarSala(Sala salaRecivido) {
        this.sala = salaRecivido;
    }

    /**
     * Proceder a modificar los datos del sala. Luego dejo el objeto que se
     * encuentra en session vacio.
     * @param sala Objeto Sala.
     */
    public void modificarSala(Sala sala) {
        bean.modificarBean(sala);
        saveMessage("Sala Modificado");
        RequestContext.getCurrentInstance().execute(
                "PF('dModificarSala').hide()");
        this.sala = null;
        desplegarSalas();
    }

    /**
     * 
     * Limpiar datos objeto.
     * 
     */
    public void limpiar() {
        this.sala = new Sala();
    }

    /**
     * Growl.
     * 
     * @param msg
     *            Se entrega el string de msg.
     * 
     */
    public static void saveMessage(String msg) {
        RequestContext.getCurrentInstance().update("miform");
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage("gfMessages", new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Alerta", "" + msg + "()"));
    }

    /**
     * 
     * Constructor.
     * 
     */
    public SalaMB() {
        if (sala == null) {
            sala = new Sala();
        }
    }

    /**
     * Allows to get the salas attribute value.
     * 
     * @return the salas value.
     */
    public List<Sala> getSalas() {
        return salas;
    }

    /**
     * Allows to set the salas attribute value.
     * 
     * @param salas
     *            new value for salas attribute.
     */
    public void setSalas(List<Sala> salas) {
        this.salas = salas;
    }

    /**
     * Allows to get the sala attribute value.
     * 
     * @return the sala value.
     */
    public Sala getSala() {
        return sala;
    }

    /**
     * Allows to set the sala attribute value.
     * 
     * @param sala
     *            new value for sala attribute.
     */
    public void setSala(Sala sala) {
        this.sala = sala;
    }

    /**
     * Allows to get the usuarioMB attribute value.
     * 
     * @return the usuarioMB value.
     */
    public UsuarioMB getUsuarioMB() {
        return usuarioMB;
    }

    /**
     * Allows to set the usuarioMB attribute value.
     * 
     * @param usuarioMB
     *            new value for usuarioMB attribute.
     */
    public void setUsuarioMB(UsuarioMB usuarioMB) {
        this.usuarioMB = usuarioMB;
    }

    /**
     * Allows to get the date attribute value.
     * 
     * @return the date value.
     */
    public Date getDate() {
        return date;
    }

    /**
     * Allows to set the date attribute value.
     * 
     * @param date
     *            new value for date attribute.
     */
    public void setDate(Date date) {
        this.date = date;
    }

}
